Skip to content

fix: Avoid DoesNotExist exception in TokenRefreshSerializer#861

Merged
Andrew-Chen-Wang merged 3 commits intojazzband:masterfrom
yuekui:Avoid-DoesNotExist-exception-in-TokenRefreshSerializer
Aug 18, 2025
Merged

fix: Avoid DoesNotExist exception in TokenRefreshSerializer#861
Andrew-Chen-Wang merged 3 commits intojazzband:masterfrom
yuekui:Avoid-DoesNotExist-exception-in-TokenRefreshSerializer

Conversation

@yuekui
Copy link
Contributor

@yuekui yuekui commented Feb 6, 2025

#860
For deleted users, they should be treated the same as when no active user is found. This DoesNotExist exception was introduced in the previous version.

Copy link
Contributor

@vgrozdanic vgrozdanic left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good to me, thank you for the contribution!

I added this PR on a checklist for next major release since it does some breaking changes: #871

Comment on lines +116 to +119
user = (
get_user_model()
.objects.filter(**{api_settings.USER_ID_FIELD: user_id})
.first()
Copy link
Member

@Andrew-Chen-Wang Andrew-Chen-Wang Feb 27, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this may not be expected since the USER_AUTHENTICATION_RULE expects a user object, not None

def default_user_authentication_rule(user: AuthUser) -> bool:

suggestion: simply check if the user exists OR check authentication rule does not pass rather than solely rely on the authentication rule

Copy link
Contributor Author

@yuekui yuekui Feb 27, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since the USER_AUTHENTICATION_RULE method already performs the user is not None check, would adding another check outside the method introduce unnecessary code duplication?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yea, the problem is the initial typing was typed assuming the user object is valid...

I mean that's my fault for not checking that. I guess this is fine, but we should also update the typing for the authentication rule?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Makes sense, updated

Copy link
Member

@Andrew-Chen-Wang Andrew-Chen-Wang left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

awesome thank you!

@vgrozdanic vgrozdanic self-assigned this Mar 2, 2025
@Andrew-Chen-Wang
Copy link
Member

qq @yuekui @mjbogusz : are you facing 500 error exceptions with this? In other words, are you having to manually catch this edge case? I noticed that the DRF exception does not inherit from the user not found exception, making this a breaking change

@mjbogusz
Copy link

I didn't get as far as getting 500s, as I was upgrading from 5.0 and our unit tests failed on previously unexpected UserNotFound.

AuthenticationFailed is already handled by DRF's APIView:handle_exception() and it's consistent with neighboring behavior for a not active account, so I've added handling this edge case by raising the same type of error and our tests passed again without any additional error handling.

@yuekui
Copy link
Contributor Author

yuekui commented Mar 17, 2025

qq @yuekui @mjbogusz : are you facing 500 error exceptions with this? In other words, are you having to manually catch this edge case? I noticed that the DRF exception does not inherit from the user not found exception, making this a breaking change

Yes, it's a 500 error and a breaking change for me. That's why I opened the issue and submitted the patch right after v5.4.0 was released.

@Andrew-Chen-Wang
Copy link
Member

Got it, it sounds like a patch release is necessary rather than a minor/major version upgrade.

@mjbogusz
Copy link

I'd say this sounds like a minor-release-level change, as it shouldn't require immediate code adjustments whether or not someone has implemented a workaround like my example in #860; the behavior will change slightly though.

The exception thrown is the same as previously and is handled by DRF already so I wouldn't say it's a breaking change either.

But of course the final decision is up to the maintainers - I'm just hoping the fix will land soon ;)

@Andrew-Chen-Wang Andrew-Chen-Wang merged commit 930cf85 into jazzband:master Aug 18, 2025
23 checks passed
@Andrew-Chen-Wang Andrew-Chen-Wang linked an issue Aug 18, 2025 that may be closed by this pull request
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Prevent DoesNotExist exception in TokenRefreshSerializer

4 participants